package com.xuan.juc.pool;

import java.util.concurrent.*;

/*
 * 三大方法
 *
 * new ThreadPoolExecutor.AbortPolicy() // 银行满了 还有人进来 不出来这个人 抛出异常
 * new ThreadPoolExecutor.CallerRunsPolicy() // 哪来的去哪里
 * new ThreadPoolExecutor.DiscardPolicy() // 队列满了 丢掉任务 不会抛出异常
 * new ThreadPoolExecutor.DiscardOldestPolicy() // 队列满了 尝试去和最早的竞争。不会抛出异常
 *
 * */
public class PoolTest1 {
    public static void main(String[] args) {
//        ExecutorService threadPool = Executors.newSingleThreadExecutor();//单个线程
//      ExecutorService threadPool = Executors.newFixedThreadPool(5);// 创建一个固定的线程池大小
//        ExecutorService threadPool = Executors.newCachedThreadPool(); // 可伸缩的 遇强则强 遇弱则弱

        // 自定义线程池
        /*
         * 最大线程到底该如何定义
         * 1. cpu 密集型，几核 保持cpu的效率最高！ Runtime.getRuntime().availableProcessors() 获取cpu核数
         * 2. IO 密集型 判断你程序中十分消耗IO的线程 一般可以设置2倍
         * 3. 存活时间（超过时间没有请求 那么会缩小）
         * 4. 单位
         * 5. 阻塞队列（类似候客区）
         * 6. 线程工厂，一般默认即可
         * 7. 拒绝策略
         * */
        ExecutorService threadPool = new ThreadPoolExecutor(3,
                5,
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy() // 队列满了 尝试去和最早的竞争。不会抛出异常
        );


        try {
            // 最大承载  deque + max 的值
            for (int i = 0; i < 9; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName());
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }

    }
}
